#include "mdcode.h"

extern int Label;
extern int  mainOff;
extern CodeFile  *firstCode ;
extern CodeFile  *lastCode ;

CodeFile *GenMidCode(TreeNode *t, int StoreNoff)
{
    /**********从构造函数拷贝，每次调用都要初始化**********/
        /*标号值，全局变量*/
        Label = 0;
        /*指向第一条中间代码*/
        firstCode = NULL ;
        /*指向当前最后一条中间代码*/
        lastCode = NULL ;

        /*主程序的noff偏移*/
        mainOff = 0;

        //TempOffset = 0;
    /**********************************************************/

      /*若有过程声明，调用相应函数，产生过程声明的中间代码*/
      TreeNode *t1=t->son[1];
      while (t1!=NULL)
      { if (t1->nodekind==ProcDecK)
           GenProcDec(t1);
        t1=t1->sibling;
      }

      /*display表相对于sp的偏移*/

      ArgRecord *Noff = ARGValue(StoreNoff);

      /*生成主程序入口声明代码*/
      CodeFile  *code = GenCode(MENTRY,NULL,NULL,Noff);

      /*初始化临时变量的开始编号,为临时变量区的第一个地址*/
      TempOffset = StoreNoff + 1;

      /*调用语句序列的代码生成函数*/
      GenBody(t->child[2]);

      /*回填主程序的AR的大小到主程序入口中间代码*/
      int size = TempOffset;
      ArgRecord  *sizeArg = ARGValue(size);
      code->codeR.arg2= sizeArg;

      return (firstCode) ;
}

void GenProcDec(TreeNode *t)
{
    /*得到过程的入口标号*/
    int ProcEntry = NewLabel( );

    /*过程名在符号表中的地址*/
//    SymbTable  *Entry = t->table[0];
    /*过程入口标号，回填入节点中*/
    Entry->attrIR.More.ProcAttr.codeEntry = ProcEntry;

    /*过程的display表的偏移量*/
    int noff = Entry->attrIR.More.ProcAttr.nOff;

    /*得到过程的层数及其ARG结构*/
    int procLevel = Entry->attrIR.More.ProcAttr.level;
    ArgRecord *levelArg = ARGValue(procLevel);


    /*若过程内部仍有过程声明，调用相应函数，产生过程声明的中间代码*/
    TreeNode *t1=t->child[1];
    while (t1!=NULL)
    { if (t1->nodekind==ProcDecK)
         GenProcDec(t1);
      t1=t1->sibling;
    }

    /*产生过程入口中间代码*/
    ArgRecord  *arg1=ARGLabel(ProcEntry);
    CodeFile *code = GenCode(PENTRY,arg1,NULL,levelArg);

    /*初始化临时变量的开始编号,为过程临时变量区的第一个地址*/
    TempOffset =  noff + procLevel+1;

    /*调用语句序列的代码生成函数处理过程体*/
    GenBody(t->child[2]);

    /*得到过程的AR的大小,回填入过程入口中间代码*/
    int size = TempOffset;
    ArgRecord *sizeArg = ARGValue(size);
    code->codeR.arg2 = sizeArg;

    /*产生过程出口中间代码*/
    GenCode(ENDPROC,NULL,NULL,NULL);
}

int NewLabel()
{
    Label++;
    retrurn(Label);
}
